package org.qiyu.live.im.router.provide.cluster;

import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.rpc.*;
import org.apache.dubbo.rpc.cluster.Directory;
import org.apache.dubbo.rpc.cluster.LoadBalance;
import org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker;

import java.util.List;

/**
 * @Description: 当集群选举的时候根据我们设置的特定的规则进行选举
 * @Author: 张广焱
 * @Date: 2023-12-10 2:42
 */
public class ImRouterClusterInvoker<T> extends AbstractClusterInvoker<T> {
    public ImRouterClusterInvoker(Directory<T> directory) {
        super(directory);
    }

    @Override
    protected Result doInvoke(Invocation invocation, List list, LoadBalance loadbalance) throws RpcException {
        //进行过滤
        checkWhetherDestroyed();//进行简单的校验
        String ip = RpcContext.getContext().get("ip")+"";
        if (StringUtils.isEmpty(ip)){
            throw new RuntimeException("ip  can not be null");
        }
        //提供返回rpc方法在注册中心一系列的地址 拉到本地内存 去挑选自己的地址
        List<Invoker<T>> invokers = list(invocation);
     Invoker<T> matchInvoker =   invokers.stream().filter(invoker->{
            //拿到我们服务提供者的暴露的地址(ip+端口的格式)
            String serviceIp =  invoker.getUrl().getHost()+":"+invoker.getUrl().getPort();
            return ip.equals(serviceIp);
        }).findFirst().orElse(null);
     if (matchInvoker==null){
               throw new RuntimeException("can not find match invoker");
          }
        return matchInvoker.invoke(invocation);
    }
}
